// Copyright (C) 2013 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
es6id: 13.6.4.13 S5.f
description: >
    The `value` of iteration result objects should be retrieved using the Get
    abstract operation.
features: [Symbol.iterator]
---*/

function Test() {
    var iterable = {};
    var i, firstIterResult;

    iterable[Symbol.iterator] = function() {
      var finalIterResult = { value: null, done: true };
      var nextIterResult = firstIterResult;

      return {
        next: function() {
          var iterResult = nextIterResult;

          nextIterResult = finalIterResult;

          return iterResult;
        }
      };
    };

    firstIterResult = { value: 45, done: false };
    i = 0;
    for (var x of iterable) {
      assert.sameValue(x, 45);
      i++;
    }
    assert.sameValue(i, 1);

    firstIterResult = { done: false };
    Object.defineProperty(firstIterResult, 'value', {
      get: function() {
        return 23;
      }
    });
    i = 0;
    for (var x of iterable) {
      assert.sameValue(x, 23);
      i++;
    }
    assert.sameValue(i, 1);
}

// preheat
const NUMBER_OF_PREHEAT = 1;
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}

ArkTools.jitCompileAsync(Test);
assert.sameValue(ArkTools.waitJitCompileFinish(Test), true, '[JIT] JIT disabled.');

// test
const NUMBER_OF_TEST = 1; // or 2
for (let i = 0; i < NUMBER_OF_PREHEAT; i++) {
    Test();
}
